// 整形提升

#include <cstdio>
#include <cstring>
#include <iostream>

int main()
{
	char a = -1; // char类型默认就是signed char
	signed char b = -1;
	unsigned char c = -1; // unsigned char类型就是无符号整形
	printf("a=%d,b=%d,c=%d", a, b, c);
	return 0;
}//输出结果是多少？
//a=-1,b=-1,c=255

// 分析
// -1 = 10000000 00000000 00000000 00000001(原码)
// 11111111 11111111 11111111 11111111(-1补码)
// a/b/c都是char类型 -> a = b = c = 11111111
// 打印格式a/b/c都是%d -> 整形提升
// a/b都是signed char类型(整型提升时,会根据最高位来补充,是1则补1,是0则补0) -> a/b = 11111111 11111111 11111111 11111111(%d是有符号整形打印,最高位是1则是补码)
// a/b = 10000000 00000000 00000000 00000001(原码) = -1
// c是unsigned char类型(整形提升时,不管是0还是1都是补0) -> c = 00000000 00000000 00000000 11111111(原码) = 255

// -----------------------------------------------------------------------------------------------------------------

int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}//输出结果是多少？
//a=4294967168

// 分析
// -128 = 10000000 00000000 00000000 10000000(原码) 
// -128 = 11111111 11111111 11111111 10000000(补码)
// a是char类型 -> a = 10000000
// 打印格式是%u -> 整形提升
// a是signed char类型(整形提升时,最高位看作符号位,前面是1则补1,是0则补0) -> a = 11111111 11111111 11111111 10000000
// %u是无符号打印, 则把a看作无符号对待 a = 4294967168

// --------------------------------------------------------------------------------------------------------------

int main()
{
	char a = 128;
	printf("%u\n", a);
	return 0;
}//输出结果是多少？
//a= 4294967168

// 分析
// 128 = 00000000 00000000 00000000 10000000(原码/补码)
// a是char类型(截取) -> a = 10000000
// %u打印 -> 整形提升
// a是signed char类型(整形提升时,最高位看作符号位,前面是1则补1,是0则补0) -> a = 11111111 11111111 11111111 10000000
// %u是无符号打印, 则把a看作无符号对待 a = 4294967168

// --------------------------------------------------------------------------------------------------------------

int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	return 0;
}//输出结果是多少？
//i+j=-10

// 分析
// -20 = 10000000 00000000 00000000 00010100(原码)
// -20 = 11111111 11111111 11111111 11101100(补码) = i
// 10 = 00000000 00000000 00000000 00001010(原码/补码) = j

// 11111111 11111111 11111111 11101100 
// 00000000 00000000 00000000 00001010
// 11111111 11111111 11111111 11110110(i + j)
// %d有符号打印 -> 最高位看作符号位
// 最高位是1则是补码 -> 10000000 00000000 00000000 00001010(原码) = -10

// --------------------------------------------------------------------------------------------------------------

int main()
{
	unsigned int i;
	for(i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}
	return 0;
}//死循环

// 分析
// i = 9 8 7 6 5 4 3 2 1 0 
// i = -1
// -1 = 10000000 00000000 00000000 00000001(原码)
// -1 = 11111111 11111111 11111111 11111111(补码)
// i是unsigned int类型 -> 会把补码看作最高位当做普通位来看
// %u打印i则是无符号打印
// i = 11111111 11111111 11111111 11111111

// --------------------------------------------------------------------------------------------------------------

int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	return 0;
}//输出结果是多少？
//255

// 分析
// char类型取值范围 : [-128, 127]
// a[0] = -1 a[1] = -2 a[3] = -4 a[4] = -5.......
// a[127] = -128
// a[128] = -129 = 10000000 00000000 00000000 10000001(补码) = 11111111 11111111 11111111 01111111(原码) -> char类型截取 -> 01111111 = 127
// a[129] = 126
// a[255] = 0
// strlen(a) = 255

// --------------------------------------------------------------------------------------------------------------

unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}//死循环

// 分析
// unsigned char类型取值范围[0, 255]
// i = 256 -> i = 00000000 00000000 00000001 00000000 -> i是char类型截取 -> i = 00000000 = 0
